/**
 * Fichier InterfaceListener.java : Définition de classe
 * fr.unice.gnpt.gui.listeners.InterfaceListener : Evénements de l'interface
 * générale
 * 
 * Auteurs : Groupe GNPT : Gastinel, Nicolas, Pellegrino, Trovato
 */
package fr.unice.gnpt.gui.listeners;

import java.awt.Desktop;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import javax.swing.JOptionPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import fr.unice.gnpt.Main;
import fr.unice.gnpt.core.util.Journal;
import fr.unice.gnpt.gui.AproposDialog;
import fr.unice.gnpt.gui.Interface;
import fr.unice.gnpt.gui.utilisateur.UtilCoordonateur;
import fr.unice.gnpt.gui.utilisateur.UtilEnseignant;

/**
 * Classe de gestion des événements de l'interface générale
 * <p>
 * Cette classe gère les événements reçus par l'interface graphique lors de
 * l'utilisation du programme. Elle implémente les interfaces {@code
 * ActionListener} et {@code WindowListener}.
 * </p>
 * 
 * @author gnpt
 * @version 0.0.2
 */
public class InterfaceListener implements ActionListener, KeyListener,
		WindowListener, ListSelectionListener, ChangeListener {
	private Interface frame;

	/**
	 * Constructeur par défaut.
	 * 
	 * @param f
	 *            l'interface principale du programme.
	 */
	public InterfaceListener(Interface f) {
		this.frame = f;
	}

	/**
	 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
	 */
	@Override
	public void actionPerformed(ActionEvent evt) {
		String action = evt.getActionCommand();

		if (action.equals("quitter")) {
			this.frame.quitter();
		} else if (action.equals("licence")) {
			this.afficherLicence();
		} else if (action.equals("ajouterService")) {
			((UtilEnseignant) this.frame.getUtilisateur())
					.ajouterEnseignement();
			((UtilEnseignant) this.frame.getUtilisateur()).updateCadreGauche();
		} else if (action.equals("apropos")) {
			new AproposDialog();
		} else if (action.equals("choixCours")) {
			((UtilEnseignant) this.frame.getUtilisateur()).afficheRestant();
		} else if (action.equals("choixCM")) {
			this.frame.validerBoutonAjout();
		} else if (action.equals("ajoutEnsNom")) {
			((UtilEnseignant) this.frame.getUtilisateur())
					.validerBoutonAjoutTA();
		} else if (action.equals("rafraichir")) {
			this.frame.rafraichir();
			if (this.frame.getUtilisateur() instanceof UtilEnseignant) {
				((UtilEnseignant) this.frame.getUtilisateur())
						.updateCadreGauche();
				// this.frame.getUtilisateur().getTableEns()
			}
		} else if (action.equals("rechercher")) {
			this.frame.rechercher();
		} else if (action.equals("choixUtil")) {
			if (this.frame.getTabs().getSelectedIndex() > 1) {
				this.frame.getTabs().setSelectedIndex(0);
			}
			((UtilEnseignant) this.frame.getUtilisateur()).getChoixPersonnels();
		} else if (action.equals("changerUtil")) {
			((UtilEnseignant) this.frame.getUtilisateur()).identification();
			((UtilEnseignant) this.frame.getUtilisateur()).updateCadreGauche();
		} else if (action.equals("ajouterEnseignant")) {
			if (this.frame.getTabs().getSelectedIndex() != 0) {
				this.frame.getTabs().setSelectedIndex(0);
			}
			((UtilCoordonateur) this.frame.getUtilisateur())
					.afficheFormulaireNouvelEnseignant();
		} else if (action.equals("validerAjouterEnseignant")) {
			((UtilCoordonateur) this.frame.getUtilisateur())
					.ajouterEnseignant();
		} else if (action.equals("ajouterCours")) {
			if (this.frame.getTabs().getSelectedIndex() != 0) {
				this.frame.getTabs().setSelectedIndex(0);
			}
			((UtilCoordonateur) this.frame.getUtilisateur())
					.afficheFormulaireNouveauCours();
		} else if (action.equals("validerAjouterCours")) {
			((UtilCoordonateur) this.frame.getUtilisateur()).ajouterCours();
		} else if (action.equals("validerAjouterTA")) {
			((UtilEnseignant) this.frame.getUtilisateur())
					.ajouterTacheAdministrative();
		} else if (action.equals("choixDispo")) {
			this.frame.getTabs().setSelectedIndex(2);
		} else if (action.equals("gererService")) {
			this.frame.valideService();
		} else if (action.equals("choisirServiceDispo")) {
			((UtilEnseignant) this.frame.getUtilisateur()).serviceDispoChoisi();
		} else {
			Journal.getJournal().logAvertissement(
					"ActionEvent non utilisé : " + action);
		}
	}

	/**
	 * Ouvre le navigateur par défaut pour afficher la licence utilisée pour ce
	 * logiciel.
	 */
	private void afficherLicence() {
		// On récupère une situation d'erreur pour faire afficher un message
		boolean onError = false;

		if (Desktop.isDesktopSupported()) {
			// On récupère l'instance du desktop
			Desktop desktop = Desktop.getDesktop();
			// On vérifie que la fonction browse est bien supportée
			if (desktop.isSupported(Desktop.Action.BROWSE)) {
				// Et on lance l'application associé au protocole
				try {
					desktop.browse(new URI(
							"http://www.gnu.org/licenses/gpl.txt"));
				} catch (IOException e) {
					// Non récupérable : browser non trouvé ou autres
					onError = true;
				} catch (URISyntaxException e) {
					// Non récupérable non plus, mais ça ne peut pas arriver
					onError = true;
				}
			} else {
				onError = true;
			}
		} else {
			onError = true;
		}

		if (onError) {
			JOptionPane
					.showMessageDialog(
							null,
							"Une erreur s'est produite lors du lancement du navigateur.\n"
									+ "Vous pouvez consulter la licence GPL à l'adresse :\n"
									+ "http://www.gnu.org/licenses/gpl.txt",
							"Navigateur non trouvé", JOptionPane.ERROR_MESSAGE);
		}
	}

	/**
	 * @see java.awt.event.WindowListener#windowActivated(java.awt.event.WindowEvent)
	 */
	@Override
	public void windowActivated(WindowEvent arg0) {
	// TODO Auto-generated method stub

	}

	/**
	 * @see java.awt.event.WindowListener#windowClosed(java.awt.event.WindowEvent)
	 */
	@Override
	public void windowClosed(WindowEvent arg0) {
	// TODO Auto-generated method stub

	}

	/**
	 * @see java.awt.event.WindowListener#windowClosing(java.awt.event.WindowEvent)
	 */
	@Override
	public void windowClosing(WindowEvent arg0) {
		// TODO Auto-generated method stub
		Main.exit(0);
	}

	/**
	 * @see java.awt.event.WindowListener#windowDeactivated(java.awt.event.WindowEvent)
	 */
	@Override
	public void windowDeactivated(WindowEvent arg0) {
	// TODO Auto-generated method stub

	}

	/**
	 * @see java.awt.event.WindowListener#windowDeiconified(java.awt.event.WindowEvent)
	 */
	@Override
	public void windowDeiconified(WindowEvent arg0) {
	// TODO Auto-generated method stub

	}

	/**
	 * @see java.awt.event.WindowListener#windowIconified(java.awt.event.WindowEvent)
	 */
	@Override
	public void windowIconified(WindowEvent arg0) {
	// TODO Auto-generated method stub

	}

	/**
	 * @see java.awt.event.WindowListener#windowOpened(java.awt.event.WindowEvent)
	 */
	@Override
	public void windowOpened(WindowEvent arg0) {
	// TODO Auto-generated method stub

	}

	/**
	 * @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)
	 */
	@Override
	public void keyPressed(KeyEvent arg0) {
	// TODO Auto-generated method stub

	}

	/**
	 * @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent)
	 */
	@Override
	public void keyReleased(KeyEvent evt) {
		String action = evt.getComponent().getName();

		if (action.equals("choixTD") || action.equals("choixTP")
				|| action.equals("ajoutEnsNom")
				|| action.equals("ajoutEnsPrenom")
				|| action.equals("ajoutCoursNom")
				|| action.equals("ajoutCoursHCM")
				|| action.equals("ajoutCoursHTD")
				|| action.equals("ajoutCoursGTD")
				|| action.equals("ajoutCoursHTP")
				|| action.equals("ajoutCoursGTP")) {
			this.frame.validerBoutonAjout();
		} else if (action.equals("ajoutTADesc") || action.equals("ajoutTAhetd")) {
			((UtilEnseignant) this.frame.getUtilisateur())
					.validerBoutonAjoutTA();
		}

	}

	/**
	 * @see java.awt.event.KeyListener#keyTyped(java.awt.event.KeyEvent)
	 */
	@Override
	public void keyTyped(KeyEvent arg0) {
	// TODO Auto-generated method stub

	}

	/**
	 * @see javax.swing.event.ListSelectionListener#valueChanged(javax.swing.event.ListSelectionEvent)
	 */
	@Override
	public void valueChanged(ListSelectionEvent evt) {
		this.frame.activeValiderService();
	}

	/**
	 * @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent)
	 */
	@Override
	public void stateChanged(ChangeEvent evt) {
		this.frame.activeValiderService();
	}

}
